#include<bits/stdc++.h>
#define MAX 200005 
using namespace std;
int tmp[MAX<<2],tot;
struct node{
	int x,y;
}p1[MAX],p2[MAX];
bool cmp(node a,node b){
	return a.x<b.x;
}
int tr[MAX<<2];
int lowbit(int x){ return x&-x; }
void add(int x,int c){ for(x;x<=tot;x+=lowbit(x)) tr[x]+=c; }
int query(int x){
	int ret=0;
	for(;x;x-=lowbit(x)) ret+=tr[x];
	return ret;
}
int n,m1,m2,ans;
int check(int x){
	int ret=0;
	for(int i=1;i<=tot;i++) tr[i]=0;
	for(int i=1;i<=m1;i++)if(query(p1[i].x)<x){
		ret++;
		add(p1[i].x,1);add(p1[i].y+1,-1);
	} 
	for(int i=1;i<=tot;i++) tr[i]=0;
	for(int i=1;i<=m2;i++) if(query(p2[i].x)<(n-x)){
		ret++;
		add(p2[i].x,1);add(p2[i].y+1,-1); 
	}
	return ret;
}
int main(){
	freopen("airport.in","r",stdin);
	freopen("airport.out","w",stdout);
	scanf("%d%d%d",&n,&m1,&m2);
	for(int i=1,x,y;i<=m1;i++){
		scanf("%d%d",&x,&y);
		p1[i]={x,y};
		tmp[++tot]=x,tmp[++tot]=y;
	}
	for(int i=1,x,y;i<=m2;i++){
		scanf("%d%d",&x,&y);
		p2[i]={x,y};
		tmp[++tot]=x,tmp[++tot]=y;
	}
	sort(tmp+1,tmp+1+tot);
	tot=unique(tmp+1,tmp+1+tot)-tmp-1;
	sort(p1+1,p1+1+m1,cmp);sort(p2+1,p2+1+m2,cmp);
	for(int i=1;i<=m1;i++){
		p1[i].x=lower_bound(tmp+1,tmp+1+tot,p1[i].x)-tmp;
		p1[i].y=lower_bound(tmp+1,tmp+1+tot,p1[i].y)-tmp;
	}
	for(int i=1;i<=m2;i++){
		p2[i].x=lower_bound(tmp+1,tmp+1+tot,p2[i].x)-tmp;
		p2[i].y=lower_bound(tmp+1,tmp+1+tot,p2[i].y)-tmp; 
	}
	int l=0,r=n;
	while(l<r-5){
		int p1=l+(r-l)/3,p2=r-(r-l)/3;
		if(check(p1)>=check(p2)) r=p2-1;
		else l=p1+1;
	}
	for(int i=l;i<=r;i++) ans=max(ans,check(i));
	printf("%d",ans);
} 
